package com.example.demo.dao;

import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.lang.Nullable;

import java.time.Duration;
import java.util.List;
import java.util.Optional;

public interface RedisDao {
    StringRedisTemplate template();

    /**
     * 根据Key获取O对象
     */
    default <O> Optional<List<O>> loadList(String key, Class<O> type) {
        return loadList(key, null, type);
    }

    /**
     * 根据Key获取List<O>对象
     */
    default <O> Optional<O> load(String key, Class<O> type) {
        return load(key, null, type);
    }

    /**
     * 根据Key以及HashKey获取O对象
     */
    default <O> Optional<List<O>> loadList(String key, Object hashKey, Class<O> type) {
        return loadString(key, hashKey)
                .map(s -> JSONObject.parseArray(s, type));
    }

    /**
     * 根据Key以及HashKey获取List<O>对象
     */
    default <O> Optional<O> load(String key, Object hashKey, Class<O> type) {
        return loadString(key, hashKey)
                .map(s -> JSONObject.parseObject(s, type));
    }

    /**
     * 保存缓存
     * 不保存NULL值
     */
    default void save(String key, @Nullable Object value, Duration duration) {
        this.save(key, null, value, duration);
    }


    /**
     * 保存缓存
     */
    void save(String key, String hashKey, @Nullable Object value, Duration duration);

    /**
     * 读取缓存
     */
    Optional<String> loadString(String key, Object hashKey);
}
